Java 数组

第八篇关于 Java 的笔记.

一. 数组的创建与初始化

1. 创建时不必马上初始化

1
int[] a = new int[10];
1
2
int[] a2;
a2 = new int[10];

都是可以的

2. 初始化的简便方法

上面的代码勉强算是初始化了, 因为有了默认值. 如果我们需要将元素初始化为我们需要的值, 只能通过下标一个一个地给元素赋值, 除此之外, 可以在创建数组的时候, 不使用 new, 直接给给元素赋值.

1
int[] b = {1, 2, 3, 5, 4, 3, 99, 0, -4, 1, 9};

3. 错误的初始化方法

先创建数组, 然后通过简便方法初始化, 这种方法是错误的.

1
2
int[] a2;
a2 = {1, 2, 3};

这种写法也是错的, 但我不知道为什么. 2017年12月11日 20:22:38

1
2
int[10] a;
int b[10];

二. 数组的默认值

1. 原始数据类型数组的默认值

类似 int, float, double 都属于原始数据类型, int 类型数组默认值 0, float, double 类型数组默认值都是 0.0.

2. 对象数组元素的默认值

在执行下面这句话之后, 数组 s 中的每个元素都有了初始值: null

1
String s = new String[10];

但是这些元素并没有指向一个对象, 如果对这些元素进行操作, 可能就报错了.

初始化的方法:

1
s[0] = new String("初始化");

三. 数组的传递

1. 直接传递数组名

按照 C 语言的想法, 通过数组名传递, 相当于传递地址, 所以是可以修改主调函数里面的值的.

通过测试, 将主函数里面的 String 数组传递到函数内部, 在函数内部修改数组元素, 主函数中数组的元素也被修改了.

2. 传递数组元素

A. 原始数据类型元素

例如传递 int 数组的某个元素, 是不会改变主调函数里面的值.

B. 引用类型元素

对象类型数组的元素都是引用类型, 它们类似于指针(猜的), 所以传递过去是可以修改主调函数里面的值.

四. 数组的赋值

a, b 是两个数组, 当执行 a = b 的时候, 此时 a, b 指向相同的内存. 也就是说, a 和 b 代表同一个数组.

五. 数组的拷贝

1
System.arraycopy(a, 0, b, 0, 10);

上面这行代码的含义是把 a 中的元素的值赋给 b.

需要注意两点:

  • 数组拷贝时长度不能超出范围, 否则会报错
  • 数组的赋值使两个数组指向同一块内存, 而数组的拷贝只是将拷贝元素的值.

并且, 对对象数组进行拷贝之后, 两个数组对应的值相等, 但是对象的元素并不指向相同的内存.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String[] string1 = new String[1];
string1[0] = "我是一个字符串";
String[] string = new String[10];

//string1 的 0 号元素赋值给 string 的 0 号元素
System.arraycopy(string1, 0, string, 0, 1);

//string 中 0 号元素的值已经被修改
print(string);

//尝试修改 string 中 0 号元素的值
string[0] = "这个元素已经被修改了";

//发现 string1[0] 的值没有被修改, 说明两个引用指向的不是同一块内存
print(string1); //输出"我是一个字符串"

六. 数组的常用操作

数组的常见操作:

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Arrays;

...

//给数组排序
Arrays.sort(b);

//以字符串的形式输出整型数组
System.out.println(Arrays.toString(b));

//比较两个数组, 如果元素完全一样则返回 true
System.out.println(Arrays.equals(a, b));

七. 注意事项:

  • 使用对象数组的元素之前要让它先指向一个对象, 否则会出现异常